require "class"


local Event = Class(function(self, parent, period, fn, mode, args, kwargs)
    self.parent = parent                                     -- 该事件所属主体
    self.period = period                                     -- 执行冷却时间
    self.fn = fn                                             -- 执行函数
    self.args = args                                         -- 执行函数位置参数
    self.kwargs = kwargs                                     -- 执行函数关键字参数
    self.pause = false                                       -- 该时间暂停触发
    self.paused = false                                      -- 暂停恢复时立即触发
    self.mode = type(mode) == "string" and mode or "at_once" -- 事件模式
end)

-- 该事件进入暂停状态
function Event:Pause()
    self.pause = true
end

-- 该事件取消暂停状态
function Event:Restore(args, kwargs)
    self.pause = false
    if self.paused then
        self.fn(args or self.args, kwargs or self.kwargs)
    end
end

-- 设置该事件模式
function Event:SetMode(mode)
    if type(mode) == "string" then
        self.mode = mode
    end
end

-- 执行该事件
function Event:Handle(args, kwargs)
    if not self.pause then
        self.fn(args or self.args, kwargs or self.kwargs)
    end
end

return Event
